package com.mkx.orderedlist.redblack;

/**
 * 红黑树节点类
 * @param <K> 键类型
 * @param <V> 值类型
 */
class RedBlackTreeNode<K extends Comparable<K>, V> {
    K key;
    V value;
    boolean isRed; // true表示红色，false表示黑色
    RedBlackTreeNode<K, V> left;
    RedBlackTreeNode<K, V> right;
    RedBlackTreeNode<K, V> parent;
    
    /**
     * 构造函数
     * @param key 键
     * @param value 值
     * @param isRed 是否为红色
     */
    RedBlackTreeNode(K key, V value, boolean isRed) {
        this.key = key;
        this.value = value;
        this.isRed = isRed;
        this.left = null;
        this.right = null;
        this.parent = null;
    }
    
    /**
     * 获取节点的兄弟节点
     * @return 兄弟节点
     */
    RedBlackTreeNode<K, V> sibling() {
        if (parent == null) {
            return null; // 根节点没有兄弟
        }
        if (this == parent.left) {
            return parent.right;
        } else {
            return parent.left;
        }
    }
    
    /**
     * 获取节点的叔叔节点
     * @return 叔叔节点
     */
    RedBlackTreeNode<K, V> uncle() {
        if (parent == null || parent.parent == null) {
            return null; // 没有父节点或祖父节点
        }
        return parent.sibling();
    }
    
    /**
     * 获取节点的祖父节点
     * @return 祖父节点
     */
    RedBlackTreeNode<K, V> grandparent() {
        if (parent == null) {
            return null;
        }
        return parent.parent;
    }
}
